#ifndef CONST_H
#define CONST_H

#include <utility>
#include <string>
#include <vector>

typedef std::pair<int, std::string> search_condition;
typedef std::pair<int, std::string> replace_pair;
typedef std::vector<std::vector<std::string> > search_result;
typedef std::pair<int, int> position;

#define MAX_DATA_NUM 506
#define MAX_COLUMN_NUM 32

#define MAX_TABLE_NAME 40
#define MAX_COLUMN_NAME 20
#define MAX_COLUMN_RANK 2
#define MAX_COLUMN_TYPE 1
#define MAX_COLUMN_LENGTH 2
#define MAX_COLUMN_NULL 1
#define MAX_ID 10
#define MAX_TABLE_INDEX 4
#define MAX_TABLE_KEY 2
#define MAX_TABLE_HAS_INDEX 4

#define N_RID 0
//系统表中每一列的含义
#define N_TABLE_NAME 1

#define N_COLUMN_ID 1
#define N_COLUMN_NAME 2
#define N_COLUMN_TYPE 3
#define N_COLUMN_LENGTH 4
#define N_COLUMN_RANK 5
#define N_COLUMN_NULL 6

#define N_INDEX_ID 1
#define N_TABLE_INDEX 2
#define N_TABLE_KEY 3
#define N_TABLE_HAS_INDEX 4

#define WHERE_TYPE_NUM 4
#define WHERE_OP_VAL 0
#define WHERE_OP_COL 1
#define WHERE_NULL 2
#define WHERE_NOT_NULL 3

#define WHERE_OP_NUM 7
#define WHERE_OP_EQUAL 0
#define WHERE_OP_NOT_EQUAL 1
#define WHERE_OP_LTE 2
#define WHERE_OP_GTE 3
#define WHERE_OP_LESS 4
#define WHERE_OP_MORE 5
#define WHERE_OP_LIKE 6

#define RID_LEN 10

#define FIRST_DATABASE_PAGE 1
#define FIRST_SYSOBJ_PAGE 2
#define FIRST_SYSCOLUMN_PAGE 4
#define FIRST_SYSINDEX_PAGE 6
#define FIRST_USER_PAGE 8

#define SYS_OBJ "sysobjects"
#define SYS_COLUMN "syscolumns"
#define SYS_INDEX "sysindexes"
#define SYS_CHECK "syscheck_"

#define PAGE_HEAD_LEN 24 //页头的长度（int）

//页头中的具体每个int的意义
#define PAGE_HEAD_INFO 0 //存储这一页的信息（当前为是否为空）
#define PAGE_HEAD_DATA_NUM 1 //表示这一页所含的数据个数
#define PAGE_HEAD_DATA_LEN 2 //表示每个数据的长度
#define PAGE_HEAD_NEXT_PAGE 3 //存储指向下个页的指针
#define PAGE_HEAD_IN_USE 8  //表示每个槽位是否在使用中

//这里定义数据页的相关信息
#define DATABASE_PAGE_NEXT_EMPTY_PAGE 0

//这里定义总索引页相关信息
#define INDEX_PAGE_NUM 0
#define INDEX_PAGE_FIRST_PAGE 4
#define INDEX_PAGE_POS 64

#define INDEX_M 4 //B+树阶数
#define INDEX_PER_LEN 20 //每个节点占的int数
#define INDEX_NODE_NUM 0 //节点中存储关键字的个数
#define INDEX_NODE_TYPE 1 //节点类型
#define INDEX_NODE_FATHER 2 //父亲节点指针
#define INDEX_NODE_DATA 4 //具体关键字数据以及儿子的指针

#define INDEX_NODE_TYPE_UP 0 //节点类型为中间节点
#define INDEX_NODE_TYPE_LEAF 1 //节点类型为叶节点

#define INDEX_VALUE 0
#define INDEX_VALUE_NEXT 1

#endif // CONST_H
